import axios from 'axios';
import { ElMessage } from 'element-plus';
import { uploadConfig, validateImageFile } from '@/config/upload';

// 创建axios实例
const apiClient = axios.create({
    timeout: uploadConfig.timeout
});

/**
 * 通用图片上传函数 - 使用批量上传接口
 * @param file 要上传的文件
 * @param onSuccess 上传成功回调
 * @param onError 上传失败回调
 * @returns Promise<string | null> 返回上传后的图片URL，失败返回null
 */
export const uploadImage = async (
    file: File,
    onSuccess?: (data: any, file: File) => void,
    onError?: (error: Error) => void,
    traceabilityId?: number,
    fieldType?: string // 新增参数：字段类型
): Promise<string | null> => {
    console.log('=== 开始图片上传 ===');
    console.log('文件信息:', {
        name: file.name,
        type: file.type,
        size: file.size
    });
    console.log('上传参数:', {
        traceabilityId,
        fieldType
    });

    // 验证文件
    const validation = validateImageFile(file);
    if (!validation.valid) {
        const error = new Error(validation.message || '文件验证失败');
        ElMessage.error(validation.message || '文件验证失败');
        onError && onError(error);
        return null;
    }

    // 验证traceabilityId
    if (!traceabilityId || traceabilityId === 0) {
        const error = new Error('溯源ID不能为空');
        ElMessage.error('溯源ID不能为空，请先保存基本信息');
        onError && onError(error);
        return null;
    }

    const formData = new FormData();
    formData.append('files', file);
    formData.append('traceabilityId', String(traceabilityId));
    formData.append('isAppend', 'true');

    // 根据字段类型设置不同的imageType，确保与后端C#代码字段名完全匹配（使用大写）
    let imageType = 'Inspection_Repor'; // 默认产品检验报告
    if (fieldType === 'certificate') {
        imageType = 'Livestock_Certification'; // 动检证
    } else if (fieldType === 'enterprise') {
        imageType = 'Certification_Documents'; // 企业照片
    } else if (fieldType === 'Food_Safety') {
        imageType = 'Food_Safety'; // 食品安全信息
    } else if (fieldType === 'Certification_Documents') {
        imageType = 'Certification_Documents'; // 企业照片
    } else if (fieldType === 'Enterprise_Image') {
        imageType = 'Enterprise_Image'; // 食品安全信息
    } else if (fieldType === 'Raw_Material') {
        imageType = 'Raw_Material'; // 原料相关材料
    } else if (fieldType === 'Auxiliary_Materials') {
        imageType = 'Auxiliary_Materials'; // 辅料相关材料
    } else if (fieldType === 'Additive_Materials') {
        imageType = 'Additive_Materials'; // 添加剂相关材料
    } else if (fieldType === 'Packaging_Materials') {
        imageType = 'Packaging_Materials'; // 包材相关材料
    } else if (fieldType === 'Processing_Photos') {
        imageType = 'Processing_Photos'; // 深加工企业照片
    }
    formData.append('imageType', imageType);

    console.log('最终上传参数:', {
        traceabilityId,
        imageType,
        fieldType,
        fileName: file.name,
        fileType: file.type,
        fileSize: file.size
    });

    // 添加更详细的调试信息
    console.log('FormData内容:');
    for (let [key, value] of formData.entries()) {
        console.log(`${key}: ${value}`);
    }

    try {
        console.log('开始上传图片到批量接口...');
        console.log('API地址:', uploadConfig.uploadMultipleUrl);

        const response = await apiClient.post(uploadConfig.uploadMultipleUrl, formData, {
            headers: { 'Content-Type': 'multipart/form-data' }
        });

        console.log('批量上传响应数据:', response.data);

        // 检查响应格式
        if (response.data && response.data.code === 200 && response.data.data && response.data.data.uploadedUrls) {
            const uploadedUrls = response.data.data.uploadedUrls;
            if (uploadedUrls.length > 0) {
                const imageUrl = uploadedUrls[0]; // 取第一个上传的图片URL
                console.log('图片上传成功，URL:', imageUrl);

                ElMessage.success('图片上传成功');
                onSuccess && onSuccess({ url: imageUrl, data: response.data.data }, file);
                return imageUrl;
            } else {
                throw new Error('上传成功但未返回图片URL');
            }
        } else {
            throw new Error('上传失败：' + (response.data?.message || '服务器返回异常'));
        }

    } catch (err: any) {
        console.error('图片上传错误:', err);
        console.error('错误详情:', {
            message: err?.message,
            response: err?.response?.data,
            status: err?.response?.status,
            statusText: err?.response?.statusText
        });

        // 更详细的错误信息
        let errorMsg = '图片上传失败：';
        if (err?.response?.data) {
            const responseData = err.response.data;
            console.error('服务器响应数据:', responseData);
            errorMsg += responseData.message || responseData || '服务器返回异常';
        } else if (err?.message) {
            errorMsg += err.message;
        } else {
            errorMsg += '网络错误';
        }

        const error = new Error(errorMsg);
        ElMessage.error(errorMsg);
        onError && onError(error);
        return null;
    }
};

/**
 * 删除图片函数
 * @param traceabilityId 溯源记录ID
 * @param fieldType 字段类型
 * @param imageUrl 要删除的图片URL（可选）
 * @returns Promise<boolean> 删除是否成功
 */
export const deleteImage = async (traceabilityId?: number, fieldType?: string, imageUrl?: string): Promise<boolean> => {
    // 验证traceabilityId
    if (!traceabilityId || traceabilityId === 0) {
        console.error('删除图片失败：溯源ID不能为空');
        ElMessage.error('溯源ID不能为空，请先保存基本信息');
        return false;
    }

    try {
        console.log('开始删除图片，traceabilityId:', traceabilityId, 'fieldType:', fieldType, 'imageUrl:', imageUrl);

        // 根据字段类型设置不同的imageType，确保与后端C#代码字段名完全匹配（使用大写）
        let imageType = 'Inspection_Repor'; // 默认产品检验报告
        if (fieldType === 'certificate') {
            imageType = 'Livestock_Certification'; // 动检证
        } else if (fieldType === 'enterprise') {
            imageType = 'Certification_Documents'; // 企业照片
        } else if (fieldType === 'Food_Safety') {
            imageType = 'Food_Safety'; // 食品安全信息
        } else if (fieldType === 'Certification_Documents') {
            imageType = 'Certification_Documents'; // 企业照片
        } else if (fieldType === 'Enterprise_Image') {
            imageType = 'Enterprise_Image'; // 食品安全信息
        } else if (fieldType === 'Raw_Material') {
            imageType = 'Raw_Material'; // 原料相关材料
        } else if (fieldType === 'Auxiliary_Materials') {
            imageType = 'Auxiliary_Materials'; // 辅料相关材料
        } else if (fieldType === 'Additive_Materials') {
            imageType = 'Additive_Materials'; // 添加剂相关材料
        } else if (fieldType === 'Packaging_Materials') {
            imageType = 'Packaging_Materials'; // 包材相关材料
        } else if (fieldType === 'Processing_Photos') {
            imageType = 'Processing_Photos'; // 深加工企业照片
        }

        const formData = new FormData();
        formData.append('traceabilityId', String(traceabilityId));
        formData.append('imageType', imageType);
        formData.append('imageUrl', imageUrl || '');
        formData.append('deleteFromQiniu', 'true');

        console.log('删除请求参数:', {
            traceabilityId,
            imageType,
            imageUrl,
            deleteFromQiniu: true
        });

        const response = await apiClient.post(uploadConfig.deleteSpecificPictureUrl, formData, {
            headers: { 'Content-Type': 'multipart/form-data' }
        });

        console.log('删除响应:', response.data);

        if (response.data && response.data.code === 200) {
            console.log('图片删除成功');
            ElMessage.success('图片删除成功');
            return true;
        } else {
            console.error('删除失败，响应数据:', response.data);
            throw new Error('删除失败：' + (response.data?.message || '服务器返回异常'));
        }
    } catch (error: any) {
        console.error('删除图片失败:', error);
        console.error('错误详情:', {
            message: error?.message,
            response: error?.response?.data,
            status: error?.response?.status,
            statusText: error?.response?.statusText
        });

        let errorMsg = '删除图片失败：';
        if (error?.response?.data) {
            const responseData = error.response.data;
            console.error('服务器响应数据:', responseData);
            errorMsg += responseData.message || responseData || '服务器返回异常';
        } else if (error?.message) {
            errorMsg += error.message;
        } else {
            errorMsg += '网络错误';
        }

        ElMessage.error(errorMsg);
        return false;
    }
};

/**
 * Element Plus Upload 组件的自定义上传函数
 * @param option Element Plus Upload 组件的 option 参数
 * @param onUploadSuccess 上传成功后的额外处理函数
 */
export const handleElementUpload = async (
    option: any,
    onUploadSuccess?: (url: string) => void | Promise<void>
) => {
    const url = await uploadImage(
        option.file,
        (data, file) => {
            option.onSuccess && option.onSuccess(data, file);
        },
        (error) => {
            option.onError && option.onError(error);
        }
    );

    if (url && onUploadSuccess) {
        try {
            await onUploadSuccess(url);
        } catch (err) {
            console.error('上传成功后处理失败:', err);
            ElMessage.warning('图片上传成功，但保存失败，请重试');
        }
    }
};
